package vn.edu.rmit.sadi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
public class ChatServer extends UnicastRemoteObject implements ChatServerRemote {
public static final int RMIREGISTRY_PORT = 1099;
public static final String REMOTE_OBJECT_URL = "rmi://localhost:1099/ChatServer";
private final HashMap<String, CallBackRemote> callbacks = new HashMap<String, CallBackRemote>();
public ChatServer() throws RemoteException {}
public static void main(String args[]) {
try {
LocateRegistry.createRegistry(RMIREGISTRY_PORT);
ChatServer srvr = new ChatServer();
Naming.rebind(REMOTE_OBJECT_URL, srvr);
System.out.println("ChatServer is running...");
} catch (Exception e) {
System.err.println("Error running ChatServer:");
System.err.println(e.getMessage());
}
}
@Override
public Status connect(String userName, CallBackRemote callback) throws RemoteException {
if (userName == null || userName.equals("") || userName.equals("ChatServer")
|| callback == null) {
return Status.UsernameInvalid;
}
synchronized (callbacks) {
if (callbacks.containsKey(userName)) {
return Status.UserExists;
}
callbacks.put(userName, callback);
}
try {
callback.addMessage("ChatServer", "Welcome " + userName);
HashMap<String, CallBackRemote> h;
synchronized (callbacks) {
h = (HashMap<String, CallBackRemote>) callbacks.clone();
}
for (CallBackRemote c : h.values()) {
c.joinedMessage(userName);
}
return Status.Success;
} catch (RemoteException ex) {
System.err.println("Error from callback " + ex.getMessage());
}
return Status.Error;
}
@Override
public void disconnect(String userName) throws RemoteException {
HashMap<String, CallBackRemote> h;
synchronized (callbacks) {
if (callbacks.remove(userName) == null) {
// user did not exist
return;
}
h = (HashMap<String, CallBackRemote>) callbacks.clone();
}
for (CallBackRemote callback : h.values()) {
callback.quitMessage(userName);
}
}
@Override
public void sendChatMessage(String userName, String message) throws RemoteException {
if (userName == null || userName.equals("")
|| message == null || message.equals("")) {
return;
}
HashMap<String, CallBackRemote> h;
synchronized (callbacks) {
if (!callbacks.containsKey(userName)) {
return;
}
h = (HashMap<String, CallBackRemote>) callbacks.clone();
}
try {
for (CallBackRemote callback : h.values()) {
callback.addMessage(userName, message);
}
} catch (Exception e) {
System.err.println("Error from callback " + e.getMessage());
}
}
}